package com.zw.a.basic.a15.demo03_reflect;

import com.itheima.pojo.Student;

import java.lang.reflect.Field;

//案例: 反射获取成员变量并使用.
/*
    Field单词的意思就是: 字段, 变量.

    反射获取成员变量涉及到的API, 以下全部都是Class类中的方法
        public Field getField(String name);     根据传入的变量名, 获取其对应的成员变量对象,  只能获取公共的.
        public Field[] getFields();             获取指定类中所有的成员变量对象, 只能获取公共的.

        public Field getDeclaredField(String name);  根据传入的变量名, 获取其对应的成员变量对象(包括私有)
            这个方法要掌握

        public Field[] getDeclaredFields();           获取指定类中所有的成员变量对象(包括私有)

    获取成员变量的目的:
        就是普通的使用变量, 或者修改某些私有的变量.
 */
public class Demo05 {
    public static void main(String[] args) throws Exception {
        //需求1: 根据成员变量名, 获取指定的公共的成员变量.
        //1. 获取该类的字节码文件对象.
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");
        //2. 获取所有的成员变量
        Field field = clazz.getDeclaredField("phone");
        //3. 创建该类对象.
        Student s = (Student) clazz.newInstance();

        //4. 设置指定对象的指定属性为指定的值.
        field.set(s, "13112345678");

        //5. 打印学生对象.
        System.out.println(s);

        //需求2: 获取所有的公共的成员变量.
        //自己写

        //需求3:  根据成员变量名, 获取指定的私有的成员变量.
        //自己写, 或者见下一个类.

        //需求4: 获取所有的的成员变量(包括私有).
        //method4();
    }

    public static void method4() throws ClassNotFoundException {
        //1. 获取该类的字节码文件对象.
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");
        //2. 获取所有的成员变量
        Field[] fields = clazz.getDeclaredFields();
        //3. 打印.
        for (Field field : fields) {
            System.out.println(field);
        }
    }
}
